Estoy depurando el siguiente código:
class A { public virtual string X => "A"; } class B : A { public bool OwnX { get; set; } = true; public override string X => OwnX ? "B" : base.X; // (o) } class Program { static void Main() => Console.WriteLine(new B().X); } Y tengo un punto de interrupción en la línea marcada con (o) . Cuando llega el punto de interrupción, intento evaluar base.X y obtengo su valor "B" :
La pregunta es: ¿por qué no "A" ?
Como otros han mencionado, este error es bien conocido .
Puede verificar trivialmente que el valor real de base.X es A , es solo el Evaluador de expresiones que devuelve el resultado incorrecto:
Debido a que X no se evalúa en tiempo de ejecución, tampoco se evaluará en el depurador. Entonces se supone que es lo mismo.
Debido a que base.X en realidad no se llama, nunca se evaluó como A. La propiedad de sobrescritura se debe a ese interlineado.
Si desea hacerlo, conviértalo en una constante.
¿Quizás debería leer un poco más sobre esto?: Operador https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/operators/conditional-operator
Dado que el valor predeterminado OwnX es verdadero.
Pruébalo con este código:
B b = new B(); b.OwnX = false; Console.WriteLine(bX);Explicando este código: public override string X => OwnX ? "B" : base.X;
para hacerlo más legible:
public override string X { get { if (Ownx == true) // this is the default value. { return "B"; } else{ return "A"; } }